/**
 * Generali Solutions d'assurances - Tous droits reserves &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.output.p44;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IIndicateurDematerialisation;
import fr.generali.accueilclient.client.om.IIndicateursDemat;
import fr.generali.accueilclient.client.om.impl.IndicateurDematerialisation;
import fr.generali.accueilclient.client.om.impl.IndicateursDemat;
import fr.generali.accueilclient.utils.constantes.CodeTypeActeEnum;
import fr.generali.accueilclient.utils.constantes.FiliereDematEnum;
import fr.generali.refservcommuns.clients.prima.DateRange;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.personnes.DtoIndicateurDematerialisation;

/**
 * The Class DtoIndicateurDematerialisation2IndicateurDematConverter.
 * 
 * @author Holmes Kelly
 */
@Component("dtoIndicateurDematerialisation2IndicateurDematP44Converter")
public class DtoIndicateurDematerialisation2IndicateurDematP44Converter implements
                Converter<List<DtoIndicateurDematerialisation>, IIndicateursDemat> {

    /** LOGGER. */
    private static final Logger LOGGER = LoggerFactory
                    .getLogger(DtoIndicateurDematerialisation2IndicateurDematP44Converter.class);

    /**
     * {@inheritDoc}
     */
    @Override
    public IIndicateursDemat convert(List<DtoIndicateurDematerialisation> source) {

        LOGGER.info("assemble indicateurs demat");

        IIndicateursDemat indicateursDemat = null;

        List<IIndicateurDematerialisation> listeindicateurDematerialisation = null;

        if (CollectionUtils.isNotEmpty(source)) {

            listeindicateurDematerialisation = new ArrayList<IIndicateurDematerialisation>(0);

            CollectionUtils.collect(source, getTransformerIndicateursDemat(), listeindicateurDematerialisation);

            indicateursDemat = getIndicateursDemat(listeindicateurDematerialisation);

        }

        return indicateursDemat;
    }

    /**
     * Gets the transformer indicateurs demat.
     * 
     * @return the transformer indicateurs demat
     */
    private Transformer getTransformerIndicateursDemat() {

        Transformer transformer = new Transformer() {

            @Override
            public Object transform(Object input) {

                DtoIndicateurDematerialisation source = DtoIndicateurDematerialisation.class.cast(input);

                IIndicateurDematerialisation indicateurDematerialisation = new IndicateurDematerialisation();

                indicateurDematerialisation.setCodeNatureDematerialisation(source.getCodeNatureDematerialisation());
                indicateurDematerialisation.setCodePorteeIndicateur(source.getCodePorteeIndicateur());
                indicateurDematerialisation.setCodeTypeActe(source.getCodeTypeActe());
                indicateurDematerialisation.setIdentifiant(source.getIdentifiant());

                DateRange periodeValidite = source.getPeriodeValidite();

                if (periodeValidite != null) {
                    indicateurDematerialisation.setDateDebut(periodeValidite.getStartDate() == null ? null
                                    : periodeValidite.getStartDate().toGregorianCalendar().getTime());
                    indicateurDematerialisation.setDateFin(periodeValidite.getEndDate() == null ? null
                                    : periodeValidite.getEndDate().toGregorianCalendar().getTime());
                }

                return indicateurDematerialisation;
            }
        };

        return transformer;

    }

    private IIndicateursDemat getIndicateursDemat(List<IIndicateurDematerialisation> listeindicateurDematerialisation) {

        IIndicateursDemat indicateursDemat = null;

        if (CollectionUtils.isNotEmpty(listeindicateurDematerialisation)) {

            indicateursDemat = new IndicateursDemat();

            for (IIndicateurDematerialisation dematerialisation : listeindicateurDematerialisation) {

                String codeNatureDematerialisation = dematerialisation.getCodeNatureDematerialisation();

                if (FiliereDematEnum.isCodeDematExistant(codeNatureDematerialisation)
                                && CodeTypeActeEnum.CODE_TYPE_ACTE_O.getCode().equals(
                                                dematerialisation.getCodeTypeActe())) {

                    FiliereDematEnum filiereDematEnumSpec =
                                    FiliereDematEnum.getFiliereDematEnumSpec(codeNatureDematerialisation);

                    if (FiliereDematEnum.CODE_DEMAT_FINANCE.equals(filiereDematEnumSpec)) {
                        indicateursDemat.setFinancierOk(true);
                    } else if (FiliereDematEnum.CODE_DEMAT_IARD.equals(filiereDematEnumSpec)) {
                        indicateursDemat.setIardOk(true);
                    } else if (FiliereDematEnum.CODE_DEMAT_PREVOYANCE_SANTE.equals(filiereDematEnumSpec)) {
                        indicateursDemat.setPrevoyanceOk(true);
                    } else if (FiliereDematEnum.CODE_DEMAT_SANTE_INDIVIDUELLE.equals(filiereDematEnumSpec)) {
                        indicateursDemat.setSanteIndividuelOk(true);
                    }
                }
            }

        }

        return indicateursDemat;
    }

}
